package top.hekun.study.asm;


import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.Opcodes;

/**
 * 〈ASM字节码修改程序〉
 *
 * @author: 贺坤
 * @date: 2023/4/22
 */
public class AsmDemo {
    /**
     * 返回的字节码
     */
    private byte[] classByte;
    /**
     * 需要修改的字节码
     */
    private byte[] classfileBuffer;

    /**
     * 初始化对象
     *
     * @param classfileBuffer
     */
    public AsmDemo(byte[] classfileBuffer) {
        this.classfileBuffer = classfileBuffer;
        System.out.println("构造ASM处理器");
    }


    /**
     * 对字节码进行修改
     *
     * @return
     */
    public AsmDemo modify() {
        System.out.println("准备修改字节码");
        // 类读取器
        ClassReader classReader = new ClassReader(classfileBuffer);
        // 类编写器
        ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
        ClassVisitor classVisitor = new MyClassVisitor(Opcodes.ASM9, classWriter);
        classReader.accept(classVisitor, ClassReader.EXPAND_FRAMES | ClassReader.SKIP_DEBUG);
        this.classByte = classWriter.toByteArray();

        return this;
    }

    /**
     * 返回修改后的字节码
     *
     * @return
     */
    public byte[] getClassByte() {
        /**
         * 当返回结果为null的时候 进行修改操作
         */
        if (classByte == null) {
            modify();
        }
        System.out.println("获取修改后的字节码");
        return classByte;
    }
}
